#!/bin/bash
echo "hello"
var="125"
echo $var

#unset 删除变量，此时echo $var是没有输出的
unset var
echo $var

for skill in ans coffe in at action ;do
    echo "i am goot at ${skill}Script"
done

: <<'COMMENT'
这里给skill加上{}，为了帮助解释器识别变量的边界，最后是$skill，不是$skillScript
上面这个循环的运行结果是：
i am goot at ansScript
i am goot at coffeScript
i am goot at inScript
i am goot at atScript
i am goot at actionScript
COMMENT

: << EOF
只要开始和结束的标识符是一样的，这样的格式都可以进行批量注释
EOF

{
    #下面的两个echo相当于注释
    echo "BJDBOC"
    echo nvjnro
    #如果在开发过程中，遇到大段的代码需要临时注释起来，过一会儿又取消注释，怎么办呢？
    #每一行加个#符号太费力了，可以把这一段要注释的代码用一对花括号括起来，定义成一个函数，没有地方调用这个函数，这块代码就不会执行，达到了和注释一样的效果。
}

echo #单独的echo是相当于一个换行

#vscode还可以使用快捷键 ctrl / ，选中进行批量注释

#readonly是只读变量 
#readonly test="123"也是错误的
test="123"
readonly test 
echo $test

#变量类型#############################################

#字符串变量       单引号或者双引号都可以
my_string="hello"
my_string1='hello'
#整数变量
declare -i my_integer=42 #这样的声明告诉 Shell 将 my_integer 视为整数，如果尝试将非整数值赋给它，Shell会尝试将其转换为整数。
#数组变量
my_array=(1 2 3 4 5)
declare -A associative_array #关联数组
associative_array["name"]="jth"
associative_array["age"]=30
#环境变量 
echo $PATH
#特殊变量
echo $? # $?表示上一个命令的退出状态
echo $# # $#表示传递给脚本的参数数量
echo $0 # $0 表示脚本的名称，$1, $2, 等表示脚本的参数

#shell字符串#############################################

#单引号 
#单引号中变量是无效的，不能出现单独的一个单引号，字符转义的单引号也不行，但是可以成对出现，作为字符串拼接使用
str1='this is a string'

#双引号
#双引号可以有变量，双引号中可以出现转义字符
your_name="jthv"
str="name is \"$your_name\"!\n"
echo $str # 输出 name is "jthv"!\n
echo -e $str # 输出 name is "jthv"! 后面是换行
             # -e 作用是启用解释转义字符,当使用 -e 选项时，echo 会处理字符串中的特殊字符，比如换行符 \n、制表符 \t、回车符 \r 等。

#拼接字符串#############################################
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

#输出
# hello, runoob ! hello, runoob !
# hello, runoob ! hello, ${your_name} !

#获取字符串长度#############
string="abddfd"
echo ${#string} #输出6
echo ${#string[0]} # 变量为字符串时，${#string} 等价与 ${#string[0]}

#提取子字符串###############
string="cnidf sndkw cd"
echo ${string:1:4} # 从字符串第 2 个字符开始截取 4 个字符：第一个字符的索引值为 0。
                   # 输出 nidf
#查找字符串#################
echo `expr index "$string" sn` #查找字符 s 或 n 的位置(哪个字母先出现就计算哪个)
                               #注意：这是 反引号 `` 不是单引号
                               #注意：sn前要留空格，输出 2


#shell数组################################################

# bash支持一维数组（不支持多维数组），并且没有限定数组的大小。
# 类似于C语言，数组元素的下标由 0 开始编号。获取数组中的元素要利用下标，下标可以是整数或算术表达式，其值应大于或等于 0

arrary_name=(value0 value1 value2 value3)
valuen=${arrary_name[0]} #获得数组元素的值
echo $valuen 

arrary_name[0]=valuex #可以用下标赋值
valuen=${arrary_name[0]}
echo $valuen

echo ${arrary_name[@]} #使用@符号可以获取数组中的所有元素

length=${#arrary_name[@]} # 4 
echo $length
length=${#arrary_name[*]} #获取数组元素个数 4
echo $length
length=${#arrary_name[0]} #获得单个元素长度 6
echo $length







